Android 6.0でICU4Jを使用して文字列の全角と半角を変換する
今回、文字列の半角と全角の変換を手軽に行いたかったため、ICU4Jというライブラリを試してみました。
ICU4Jとは
ICUとはユニコードと国際化をサポートするライブラリセットで、ICU4JはICUにおけるJava向けのライブラリです。
ICU4J互換のAPIがAndroid 7.0から公式のSDKに含まれていますが、開発中のアプリで6.0をサポートしたかったため、今回はICU4Jのライブラリをそのまま使用します。
導入
アプリモジュールのbuild.gradleのdependenciesに下記を追加します。
implementation 'com.ibm.icu:icu4j:使用するICU4Jのバージョン'
動作環境のAPIレベルによって、互換性があるICU4Jのバージョンは異なります。次のAndroidの公式ドキュメントに、APIレベルごとに互換性があるICU4Jのバージョンが記載されているので、まずは確認しましょう。
たとえば、開発中のアプリのminSdkVersionが23(Android 6.0)の場合は、次のように55.1
を指定します。
implementation 'com.ibm.icu:icu4j:55.1'
これで、Android 7.0とは互換性があって動くのに、Android 6.0ではクラッシュしてしまうといった問題を避けられます。
この記事での実行結果などは、このバージョン55.1
を使用した場合の結果を記載します。
実装と動作確認
ICU4Jが提供しているTransliteratorクラスを使用します。実装時に誤ってSDKのAPIをimportしないように気をつけましょう。
// このブログの記事のようにICU4Jのライブラリをそのまま使用する場合は次のコードでimport import com.ibm.icu.text.Transliterator // Androidの公式SDKのICU4J互換のAPIを使用する場合。この記事では使用していない // import android.icu.text.Transliterator
全角から半角に変換する
Transliterator#getInstance()
の引数に"Fullwidth-Halfwidth"
を指定して使用します。
// 全角から半角への変換 val toHalfwidthTransliterator = Transliterator.getInstance("Fullwidth-Halfwidth") val fullwidthText = "123456789@abcdefg" val halfwidthResult = toHalfwidthTransliterator.transliterate(fullwidthText) // => "123456789@abcdefg"
半角から全角に変換する
Transliterator#getInstance()
の引数に"Halfwidth-Fullwidth"
を指定して使用します。さきほどとは、Fullwidth
とHalfwidth
の記述が逆になっていることに注意してください。
// 半角から全角への変換 val toFullwidthTransliterator = Transliterator.getInstance("Halfwidth-Fullwidth") val halfwidthText = "123456789@abcdefg" val fullwidthResult = toFullwidthTransliterator.transliterate(halfwidthText) // => "123456789@abcdefg"
さいごに
ICU4Jを使用して、手軽に半角と全角文字列の変換が行えました。
この記事ではICU4Jを使用しましたが、java.text.Normalizer
を使用して行う方法もあるようです。ユニコードの正規化を目的としたAPIなので、期待していない変換も行われるようですが、要件次第ではICU4Jを導入するよりも良い選択肢かもしれません。
また、ユニコードに新しく追加された絵文字や、Androidでしかサポートされていない絵文字を対象とした処理が必要な場合は、Androidの公式ドキュメントを参考に、ICU4J互換のAPIの使用を検討しても良さそうです。
使用した環境など
Android Studio
Android Studio 3.5 Build #AI-191.8026.42.35.5791312, built on August 9, 2019 JRE: 1.8.0_202-release-1483-b49-5587405 x86_64 JVM: OpenJDK 64-Bit Server VM by JetBrains s.r.o macOS 10.15.2
動作検証端末
下記設定のエミュレータ。
Nexus 5X Android 6.0 (API 23) x86_64
Pixel 3a Android 9.0 (API 28) x86_64